#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# ----------------------------------------------------------
# -- This's PDG Transform
# -- PDF 转换工具
#    1. pip3 install wand
#    2. 安装图像处理工具 ImageMagick-6.9.10-8-Q16-x86-dll.exe
#       配置环境变量：
#               变量名: MAGICK_HOME
#               变量值: D:\Program Files (x86)\ImageMagick-6.9.10-Q16
#    3. 安装翻译工具 gs923w32.exe
# ****************************
# Author: lmay.Zhou
# Blog: www.lmaye.com
# Email lmay@lmaye.com
# Date: 2018/7/27 10:15 星期五
# ----------------------------------------------------------
import datetime


def pdf_to_image(file_path, img_type, **kwargs):
    """
        将PDF文件转为图片文件

        :param file_path:   读取路径
        :param img_type:    文件类型(png, jpg...)
        :param kwargs:      关键字参数
        :return:
    """
    try:
        from wand.image import Image
    except Exception as e:
        if kwargs["signal_out"]:
            kwargs["signal_out"].emit("{} PDF工具依赖环境异常：请安装图像处理工具[ImageMagick-6.9.10-8-Q16-x86-dll.exe]".format(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')))
        raise e
    try:
        image_pdf = Image(filename=file_path, resolution=300)
        image = image_pdf.convert(img_type)
        # wand已经将PDF中所有的独立页面都转成了独立的二进制图像对象。我们可以遍历这个大对象，并把它们加入到rs_image序列中去。
        rs_image = []
        for img in image.sequence:
            img_page = Image(image=img)
            rs_image.append(img_page.make_blob(img_type))
        # 遍历rs_image, 保存为图片文件
        i = 0
        # image list
        images = []
        # 文件目录
        file_dir = file_path[: file_path.rindex("/") + 1]
        for img in rs_image:
            file_name = file_path[file_path.rindex("/") + 1: file_path.index(".")] + "_" + str(i) + "." + img_type
            if kwargs["signal_out"]:
                kwargs["signal_out"].emit("{} 开始写入: {}".format(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'), file_name))
            file = open(file_dir + file_name, "wb")
            file.write(img)
            file.close()
            i += 1
            images.append(file_name)
        if kwargs["signal_out"]:
            kwargs["signal_out"].emit("{} PDF转 {} 完成!!!".format(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'), img_type))
        if len(images) > 0:
            # 合并图片
            images_joint(file_dir, img_type, images)
    except Exception as e:
        if e.wand_error_code if hasattr(e, "wand_error_code") else 0 == 415:
            if kwargs["signal_out"]:
                kwargs["signal_out"].emit("{} PDF工具依赖环境异常：请安装翻译工具[gs923w32.exe]".format(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')))
        raise e


def images_joint(file_path, img_type, images):
    """
        图片拼接

        :param file_path:   文件路径
        :param img_type:    图片格式(jpg|png|more)
        :param images:      image list
        :return:            合成长图
    """
    from PIL import Image
    # 使用PIL加载所有图片
    ims = [Image.open(file_path + fp) for fp in images if fp.endswith(img_type)]
    # 单幅图片尺寸
    width, height = ims[0].size
    # 创建空白长图
    result = Image.new(ims[0].mode, (width, height * len(ims)))
    # 拼接图片
    for i, im in enumerate(ims):
        result.paste(im, box=(0, i * height))
    # 保存
    result.save(file_path + images[0][:images[0].rindex("_")] + "." + img_type)
